package ParserHorarios;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Parser {
	
	public static InfoFacultad ParsearTodo() {
		
		InfoFacultad facultad = new InfoFacultad();
		Parser.ParsearDepartamentos(facultad);
		
		for (Departamento departamento : facultad.getDepartamentos()) {
			Parser.ParsearMaterias(departamento);
		
			for (Materia materia : departamento.getMaterias()) {
				Parser.ParsearCursos(materia);
			}
		}
		
		return facultad;
	}

	public static void ParsearDepartamentos(InfoFacultad facultad) {
		
		Document doc;
		try {
			
			doc = Jsoup.connect("http://intra.fi.uba.ar/insc/consultas/cursos.jsp").get();
			Elements elementos = doc.select("tr");
			elementos.remove(0);
			
			for (Element elemento : elementos) {
					
				int codigo = Integer.parseInt(elemento.select("td[class=tablaitem]").first().text());
				String nombre = elemento.select("td[class=tablaitem]").get(1).text();
				String URLinfo = elemento.select("td[class=tablaitem]").first().select("a").attr("href");				
			
				Departamento departamento = new Departamento(codigo, nombre, URLinfo);
				facultad.AgregarDepartamento(departamento);
				
			}
			
		} catch (IOException e) {
				e.printStackTrace();
		}
	}
	
	public static void ParsearMaterias(Departamento departamento) {
		
		try {
			
			Document doc = Jsoup.connect("http://intra.fi.uba.ar/insc/consultas/" + departamento.getURLinfo()).get();
			Elements elementos = doc.select("tr");
			elementos.remove(0);
			
			for (Element elemento : elementos) {
				
				int codigo = Integer.parseInt(elemento.select("td[class=tablaitem]").first().text());
				String nombre = elemento.select("td[class=tablaitem]").get(1).text();
				String URLinfo = elemento.select("td[class=tablaitem]").first().select("a").attr("href");				
			
				Materia materia = new Materia(codigo, nombre, URLinfo);
				departamento.AgregarMateria(materia);
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void ParsearCursos(Materia materia) {
		
		try {
			
			Document doc = Jsoup.connect("http://intra.fi.uba.ar/insc/consultas/" + materia.getURLinfo()).get();
			Elements elementos = doc.select("tr");
			elementos.remove(0);
			elementos.remove(elementos.size()-1);
			
			for (Element elemento : elementos) {
				
				String codigo = elemento.select("td[class=tablaitem]").first().text();
				String catedra = elemento.select("td[class=tablaitem]").get(2).text();
				String horarios = elemento.select("td[class=tablaitem]").get(4).text();				
				
				Curso curso = new Curso(codigo, catedra);
				
				try {
					ParsearHorarios(curso, horarios);
				} catch (Exception e) {
					ErrorHandler.ErrorCargaHorarios(materia, curso, horarios);
				}
				materia.AgregarCurso(curso);
				
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void ParsearHorarios(Curso curso, String horarios) throws Exception {
			
		while (true) {
			
			horarios = horarios.replace("A ASIG", "A_ASIG");
			
			String tipo = horarios.substring(0, horarios.indexOf(' '));
			horarios = horarios.substring(horarios.indexOf(' ')+1);
				
			String dia = horarios.substring(0, horarios.indexOf(' '));
			horarios = horarios.substring(horarios.indexOf(' ')+1);
			
			String inicio = horarios.substring(0, horarios.indexOf(' '));
			horarios = horarios.substring(horarios.indexOf(' ')+1);
				
			String fin = horarios.substring(0, horarios.indexOf(' '));
			horarios = horarios.substring(horarios.indexOf(' ')+1);
				
			String sede = horarios.substring(0, horarios.indexOf('-'));
			horarios = horarios.substring(horarios.indexOf('-')+1);
			
			String aula = (horarios.indexOf(' ') > 0) ? horarios.substring(0, horarios.indexOf(' ')) 
					: horarios;
			horarios = (horarios.indexOf(' ') > 0) ? horarios.substring(horarios.indexOf(' ')+1) : "";
			
			Horario horario = new Horario(tipo, dia, inicio, fin, sede, aula);
			curso.AgregarHorario(horario);
			
			if (horarios.length() == 0)  break;
		}
	}

}